package com.bsj.sipgateway.sip.transmit.cmd;


import com.bsj.power.common.def.entity.gb28181.Device;
import com.bsj.sipgateway.command.RocketMqCommand;

import javax.sip.InvalidArgumentException;
import javax.sip.SipException;
import java.text.ParseException;

/**
 * @author bsj-chenjunkang
 * @Description:设备能力接口，用于定义设备的控制、查询能力
 * @date 2022/8/31
 */
public interface ISIPCommander {


    /**
     * 请求预览视频流
     *
     * @param deviceId      设备国标id
     * @param channelSerial 预览通道序号
     */

    /**
     * 请求预览视频流（直播）
     *
     * @param deviceId      国标设备id
     * @param channelSerial 逻辑通道号
     * @param bitStream     分辨率
     */
    void playStreamCmd(String deviceId, Integer channelSerial, Integer bitStream);


    /**
     * 请求回放视频流（回放指令发送给cvr）
     *
     * @param startTime     回放开始时间
     * @param endTime       回放结束时间
     * @param deviceId      国标设备id
     * @param channelSerial 逻辑通道号
     * @param port          回放端口
     */
    void playbackStreamCmd(Long startTime, Long endTime, String deviceId, Integer channelSerial, Integer port);

    /**
     * 视频流停止
     *
     * @param deviceId      国标设备id
     * @param type          类型，0：直播，1：回放
     * @param channelSerial 逻辑通道号
     */
    void streamByeCmd(String deviceId, String type, int channelSerial);


    /**
     * 更新直播通道信息
     *
     * @param deviceId      国标设备id
     * @param type          类型 0是直播 1是回放
     * @param channelSerial 逻辑通道号
     */
    void updatePlayStreamState(String deviceId, String type, Integer channelSerial);

    /**
     * 查询设备信息
     *
     * @param device 视频设备
     * @return
     */
    boolean deviceInfoQuery(Device device);

    /**
     * 查询目录列表
     *
     * @param device 视频设备
     */
    boolean catalogQuery(Device device);


    /**
     * 查询回放资源
     *
     * @param deviceId      设备国标编号
     * @param channelSerial 逻辑通道号
     * @param startTime     开始时间
     * @param endTime       结束时间
     * @return
     */
    boolean recordInfoQuery(String deviceId, int channelSerial, String startTime, String endTime);

    /**
     * 语音广播
     */
    void broadcastStreamCmd(String deviceId, RocketMqCommand command);


    /**
     * 订阅、取消订阅移动位置
     *
     * @param device   视频设备
     * @param expires  订阅超时时间（值=0时为取消订阅）
     * @param interval 上报时间间隔
     * @return true = 命令发送成功
     */
    boolean mobilePositionSubscribe(Device device, int expires, int interval);

    /**
     * 前端控制，包括PTZ指令、FI指令、预置位指令、巡航指令、扫描指令和辅助开关指令
     *
     * @param deviceId      控制设备国标id
     * @param channelSerial 预览通道序列号
     * @param cmdCode       指令码
     * @param parameter1    默认0
     * @param parameter2    这个参数是预置位编号默认1
     * @param combineCode2  默认0
     * @throws SipException
     * @throws InvalidArgumentException
     * @throws ParseException
     */
    void frontEndCmd(String deviceId, int channelSerial, int cmdCode, int parameter1, int parameter2, int combineCode2) throws InvalidArgumentException, SipException, ParseException;


    /**
     * 设备云台控制
     *
     * @param
     * @param deviceId      设备id
     * @param channelSerial 逻辑通道号
     * @return
     */
    boolean ptz(String command, int moveSpeed, String deviceId, int channelSerial);

    /**
     * 远程启动/重启
     *
     * @param deviceId
     */
    void teleBootCmd(String deviceId);

    /**
     * 报警布防/撤防
     *
     * @param deviceId
     * @param guardCmdStr
     */
    void guardCmd(String deviceId, String guardCmdStr);

    /**
     * 暂停播放
     *
     * @param did
     * @param channelSerial
     */
    void playPauseCmd(Long did, Integer channelSerial);

    /**
     * 回放恢复
     */
    void playResumeCmd(Long did, Integer channelSerial);


    /**
     * 回放倍速播放
     */
    void playSpeedCmd(Long did, Integer channelSerial, Double speed);

    /**
     * 录像控制
     *
     * @param did
     * @param recordCmdStr  录像命令：Record / StopRecord
     * @param channelSerial
     */
    void recordCmd(Long did, String recordCmdStr, Integer channelSerial);


}
